﻿using QuanLyGiaoVuDAL.DTO;
using QuanLyGiaoVuDAL.Repositories.DatabaseRepositories;
using QuanLyGiaoVuService.CommonServices;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace QuanLyGiaoVuService.CommandServices
{
    public class DangKyGioDayCommandService : IDangKyGioDayCommandService
    {
        private IDangKyGioDayRepository _dangKyGioDayRepository;
        private ILopMonHocRepository _lopMonHocRepository;
        private IXepLichService _xepLichService;

        public DangKyGioDayCommandService(IDangKyGioDayRepository dangKyGioDayRepository, ILopMonHocRepository lopMonHocRepository, IXepLichService xepLichService)
        {
            _dangKyGioDayRepository = dangKyGioDayRepository;
            _lopMonHocRepository = lopMonHocRepository;
            _xepLichService = xepLichService;
        }

        public QuanLyGiaoVuDAL.DTO.DangKyGioDayDTO InsertThongTinDangKyGioDay(QuanLyGiaoVuDAL.DTO.DangKyGioDayDTO dangKyGioDayDTO)
        {
            if (dangKyGioDayDTO.TietDauDTO.TietThu > dangKyGioDayDTO.TietSauDTO.TietThu)
                throw new Exception("Tiết đầu phải nhỏ hơn hoặc bằng tiết sau.");
            var dsDangKy = _dangKyGioDayRepository.GetAllDangKyGioday(null, dangKyGioDayDTO.MaLopMonHoc, null, null, null, null).ToList();
            var dsDangKyCungDoUuTien = dsDangKy.Where(dk => dk.DoUuTien == dangKyGioDayDTO.DoUuTien);
            if (dsDangKyCungDoUuTien.Count() > 0)
                throw new Exception(String.Format("Lớp này đã được đăng ký lịch dạy với độ ưu tiên {0}. Đề nghị chọn độ ưu tiên khác.",dangKyGioDayDTO.DoUuTien));
            if (dangKyGioDayDTO.MaThongTinGiangDay.Equals(Guid.Empty))
                dangKyGioDayDTO.MaThongTinGiangDay = Guid.NewGuid();
            if (dsDangKy.Count == 0)
                dangKyGioDayDTO.DuocChon = true;
            var thongTinDangKy = _dangKyGioDayRepository.InsertDangKyGioDay(dangKyGioDayDTO);
            if (dsDangKy.Count > 0)
            {
                dsDangKy.Add(thongTinDangKy);
                foreach (var dangKy in dsDangKy)
                {
                    dangKy.DuocChon = false;
                    _dangKyGioDayRepository.UpdateDangKyGioDay(dangKy);
                }
                var doUuTienCaoNhat = dsDangKy.Min(dk => dk.DoUuTien);
                var dangKyDuocChon = dsDangKy.Find(dk => dk.DoUuTien == doUuTienCaoNhat);
                if (dangKyDuocChon != null)
                {
                    dangKyDuocChon.DuocChon = true;
                    _dangKyGioDayRepository.UpdateDangKyGioDay(dangKyDuocChon);
                }
            }
            return thongTinDangKy;
        }

        public QuanLyGiaoVuDAL.DTO.DangKyGioDayDTO UpdateThongTinDangKyGioDay(QuanLyGiaoVuDAL.DTO.DangKyGioDayDTO dangKyGioDayDTO)
        {
            return _dangKyGioDayRepository.UpdateDangKyGioDay(dangKyGioDayDTO);
        }

        public bool DeleteThongTinDangKyGioDayById(Guid thongTinDangKyGioDayId)
        {
            return _dangKyGioDayRepository.DeleteDangKyGioDay(thongTinDangKyGioDayId);
        }


        public void HuyThongTinDangKyGioday(Guid thongTinDangKyGioDayId, string ghiChu)
        {
            DangKyGioDayDTO dangKyGioDayDTO = _dangKyGioDayRepository.GetDangKyGioDayById(thongTinDangKyGioDayId);
            dangKyGioDayDTO.Huy = true;
            dangKyGioDayDTO.GhiChu = ghiChu;
            _dangKyGioDayRepository.UpdateDangKyGioDay(dangKyGioDayDTO);
        }
    }
}
